//
//  CustomView.m
//  矩阵操作
//
//  Created by 伍银荣 on 2021/7/2.
//  Copyright © 2021 com.example. All rights reserved.
//

#import "CustomView.h"

@implementation CustomView


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    
   // [self matrixOperations];
   // [self memoryManagement];
    
   // [self graphicsContextStack];
    
    [self drawTextWithRect:rect];
}


//绘制文字
- (void)drawTextWithRect:(CGRect)rect {
    NSString *str = @"我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门,我爱北京天安门";
    //从某一个点开始绘制
    NSShadow *shadow = [[NSShadow alloc]init];
    shadow.shadowOffset = CGSizeMake(50, 0); //阴影的偏移量
    shadow.shadowBlurRadius = 10;  //模糊程度,越小越不模糊
    shadow.shadowColor = [UIColor orangeColor];  //阴影的颜色
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];
    style.lineSpacing = 20;
    style.firstLineHeadIndent = 50;
    
    //NSUnderlineStyleAttributeName:设置为1,有下划线.  0没有下划线
   // [str drawAtPoint:CGPointMake(50, 50) withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:25], NSForegroundColorAttributeName: [UIColor redColor],NSUnderlineStyleAttributeName: @(1), NSBackgroundColorAttributeName: [UIColor greenColor],NSShadowAttributeName: shadow, NSKernAttributeName:@(1), NSParagraphStyleAttributeName: style}];
    
    //绘制到指定的区域
   // [str drawInRect:CGRectMake(0, 0, 300, 300) withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:20], NSForegroundColorAttributeName: [UIColor redColor], NSBackgroundColorAttributeName: [UIColor greenColor]}];
    [str drawInRect:rect withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:20], NSForegroundColorAttributeName: [UIColor redColor], NSBackgroundColorAttributeName: [UIColor greenColor],NSParagraphStyleAttributeName: style}];
    
}



/**
 图形上下文栈的操作:
 1.备份:将当前图形上下文中的"绘图状态"信息保存到"栈"中
 2.恢复:将栈顶的绘图状态出栈,替换掉当前图形上下文中的绘图状态
*/
- (void)graphicsContextStack {
    //获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    //备份:将当前图形上下文中的"绘图状态"信息保存到"栈"中
    CGContextSaveGState(ctx);
    //拼接路径,同时添加到上下文中
    CGContextAddArc(ctx, 175, 175, 100, 0, M_PI *2, 1);
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, 375, 375);
    //设置线宽
    CGContextSetLineWidth(ctx, 10);
    //再次备份
    CGContextSaveGState(ctx);
    //设置颜色
    [[UIColor redColor] set];
    //渲染
    CGContextStrokePath(ctx);
    
    
    //拼接路径
    CGContextMoveToPoint(ctx, 20, 20);
    CGContextAddLineToPoint(ctx, 200, 20);
    //恢复:将栈顶的绘图状态出栈,替换掉当前图形上下文中的绘图状态
    CGContextRestoreGState(ctx);
    //再次恢复
    CGContextRestoreGState(ctx);
    
    
    //再次渲染
    CGContextStrokePath(ctx);
}



/**
 Quartz 2D中的内存管理问题:
 使用path对象中的内存管理问题
  1.凡是在函数名字中包含了retain,copy,create关键字,那么在调用完毕该函数,创建出的对象,在使用完毕后,都需要被释放.
      2.CGPathCreateMutable()不是oc方法,所以CGPathCreateMutable()不是调用了某个对象的release方法,因此它在oc的ARC下是可以使用的.
      3.有CGxxxxxCreate就对应有CGxxxxxrelease方法.
      4.通过CFRelease(任意类型),就可以使用任何类型.
 */
- (void)memoryManagement {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    //创建路径
    CGMutablePathRef path = CGPathCreateMutable();
    //拼接路径
    CGPathAddRect(path, NULL, CGRectMake(50, 50, 200, 100));
    //将路径添加到上下文中
    CGContextAddPath(ctx, path);
    //渲染(将图形上下文中绘制的图形绘制到对应的设备上)
    //如果我使用Product下的Analyze进行分析,会发现在这里会显示一行文字:Potential leak of an object stored into 'path',存储在path中的一个对象出现了潜在泄露.意思是内存泄露了.原因是使用了CGPathCreateMutable()函数创建了path对象.
    CGContextStrokePath(ctx);
    
    //所以在使用完这个对象后,需要调用release函数进行释放
    //CGPathRelease(path);
    //可以使用CFRelease释放任何类型
    CFRelease(path);
    
}

//矩阵操作  matrix:矩阵
- (void)matrixOperations {
    //获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //这里首先是把上下文缩放,旋转,平移之后,之后的图形就都是在旋转,缩放,平移的上下文中绘制的
    //对图形上下文进行旋转
    //CGContextRotateCTM(ctx, M_PI_4);
    //对图形上下文进行缩放
    //CGContextScaleCTM(ctx, 0.5, 0.5);
    //对上下文进行平移
    CGContextTranslateCTM(ctx, 0, 175);
    //拼接路径,将路径添加到图形上下文中
    CGContextAddArc(ctx, 175, 175, 100, 0, M_PI * 2, 1);
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, 375, 375);
    //设置线宽
    CGContextSetLineWidth(ctx, 10);
    //设置颜色
    [[UIColor redColor] set];
    //如果写在这里的话,只是当前的线宽变成了5而已,其他的上下文路径都没有改变
    //CGContextScaleCTM(ctx, 0.5, 0.5);
    //如果写在这里的话,没有发生什么平移的变化
    //CGContextTranslateCTM(ctx, 0, 175);
    
    //渲染
    CGContextStrokePath(ctx);
}


@end
